If xen is compiled with crash_debug=y and the debugger is not
connected, the fault handler enters infinite loop. regs may
be on stack, so split the incrementing out of vcpu_increment_iip().
Signed-off-by: Kazuhiro Suzuki <kaz@jp.fujitsu.com>
if (iim == 0)
show_registers(regs);
debugger_trap_fatal(0 /* don't care */, regs);
+ regs_increment_iip(regs);
} else
#endif
{
if (iim == 0)
show_registers(regs);
debugger_trap_fatal(0 /* don't care */ , regs);
+ regs_increment_iip(regs);
}
#endif
else if (iim == d->arch.breakimm &&
IA64FAULT vcpu_increment_iip(VCPU * vcpu)
{
REGS *regs = vcpu_regs(vcpu);
- struct ia64_psr *ipsr = (struct ia64_psr *)®s->cr_ipsr;
- if (ipsr->ri == 2) {
- ipsr->ri = 0;
- regs->cr_iip += 16;
- } else
- ipsr->ri++;
+ regs_increment_iip(regs);
return IA64_NO_FAULT;
}
# define guest_mode(regs) (ia64_psr(regs)->cpl != 0)
# define guest_kernel_mode(regs) (ia64_psr(regs)->cpl == CONFIG_CPL0_EMUL)
# define vmx_guest_kernel_mode(regs) (ia64_psr(regs)->cpl == 0)
+# define regs_increment_iip(regs) \
+do { \
+ struct ia64_psr *ipsr = ia64_psr(regs); \
+ if (ipsr->ri == 2) { \
+ ipsr->ri = 0; \
+ regs->cr_iip += 16; \
+ } else \
+ ipsr->ri++; \
+} while (0)
#else
# define user_mode(regs) (((struct ia64_psr *) &(regs)->cr_ipsr)->cpl != 0)
#endif